from flask import Flask, render_template, request, redirect
from persistence.userDao import *
import json
from gevent import monkey
from gevent.pywsgi import WSGIServer
from hashlib import md5

# 猴子补丁如果遇见耗时操作会自动进行协程的切换
monkey.patch_all()

from multiprocessing import cpu_count, Process

app = Flask(__name__)


@app.route('/user/register', methods=['POST'])
def register():
    id1 = 123
    password = 123123123
    s = md5()
    s.update(str(password).encode())
    print(s.hexdigest())
    user_register(id1, password)


@app.route('/user/account', methods=['POST'])
def account():
    return '修改个人信息'


@app.route('/user/<int:id>', methods=['GET', 'POST'])
def upVIP(id):
    return_vip = {'status': '0', 'id': 'none'}
    return_vip["status"] = "200"
    return_vip["id"] = id
    return return_vip


@app.route('/user/login', methods=['GET', 'POST'])
def login():
    return_dict = {'status': '0', 'key': 'none'}
    if request.method == "POST":
        username = request.values.get("username")
        password = request.values.get("password")

        print("username = {} => password = {}".format(username, password))

        if username == "123" and password == "123":
            return_dict["status"] = "200"
            return_dict["key"] = "成功登录"
            return json.dumps(return_dict, ensure_ascii=False)

    if request.method == 'GET':
        return '正经人谁用GET登录啊'


def run(MULTI_PROCESS):
    """
    Web Server Gateway Interface，WSGI解构服务器和app，使得代码这边自己可以高并发，这玩意就是个中间件
    WSGI协议主要包括server和application两部分
    server：处理 HTTP 协议，接受用户 HTTP 请求和提供并发，调用 web application 处理业务逻辑
    application：处理server转发的请求

    flask + gevent + multiprocess + wsgi实现高并发(多进程 + 协程)
    原理：
        1. Flask实现的Web框架接口间是非阻塞的，即调用一个接口,不需要等待返回结果；
        2. 对于高并发的任务动辄几十万的数量而言，使用多进程或者多线程无异于找死，很容易造成资源崩溃的情况。所以为了实现并发一般都是采用协程进行并发。
        3. gevent的WSGIServer，自身就实现了协程，基于greenlet和wsgiref两个协程库，因此直接调用即可
    """
    # 不执行多进程
    if MULTI_PROCESS == False:
        # 参数1：server; 参数2：app; WSGIServer：中间件
        WSGIServer(('0.0.0.0', 5000), app).serve_forever()
    # 执行多进程
    else:
        mulserver = WSGIServer(('0.0.0.0', 5000), app)
        mulserver.start()

        def server_forever():
            mulserver.start_accepting()
            mulserver._stop_event.wait()

        # 根据CPU个数，启动进程
        for i in range(cpu_count()):
            p = Process(target=server_forever)
            p.start()


if __name__ == '__main__':
    # app.run()
    # 单进程 + 协程
    # run(False)

    # 多进程 + 协程
    run(True)



